import type { GitCallbacks } from '@yaakapp-internal/git';
import { showPromptForm } from '../../lib/prompt-form';
import { Banner } from '../core/Banner';
import { InlineCode } from '../core/InlineCode';
import { addGitRemote } from './showAddRemoteDialog';

export function gitCallbacks(dir: string): GitCallbacks {
  return {
    addRemote: async () => {
      return addGitRemote(dir);
    },
    promptCredentials: async ({ url: remoteUrl, error }) => {
      const isGitHub = /github\.com/i.test(remoteUrl);
      const userLabel = isGitHub ? 'GitHub Username' : 'Username';
      const passLabel = isGitHub ? 'GitHub Personal Access Token' : 'Password / Token';
      const userDescription = isGitHub ? 'Use your GitHub username (not your email).' : undefined;
      const passDescription = isGitHub
        ? 'GitHub requires a Personal Access Token (PAT) for write operations over HTTPS. Passwords are not supported.'
        : 'Enter your password or access token for this Git server.';
      const r = await showPromptForm({
        id: 'git-credentials',
        title: 'Credentials Required',
        description: error ? (
          <Banner color="danger">{error}</Banner>
        ) : (
          <>
            Enter credentials for <InlineCode>{remoteUrl}</InlineCode>
          </>
        ),
        inputs: [
          { type: 'text', name: 'username', label: userLabel, description: userDescription },
          {
            type: 'text',
            name: 'password',
            label: passLabel,
            description: passDescription,
            password: true,
          },
        ],
      });
      if (r == null) throw new Error('Cancelled credentials prompt');

      const username = String(r.username || '');
      const password = String(r.password || '');
      return { username, password };
    },
  };
}
